# Appendix B

# A Skeletal CBIOS

NOTE

This appendix consists of a cross-reference listing generated by the XREF utility from the results of assembly with MAC. The original source file used to generate this listing is available here.

         1                  ;	SKELETAL CBIOS FOR FIRST LEVEL OF CP/M 2.0 ALTERATION
         2                  ;
         3   0014 =         MSIZE	EQU	20		;CP/M VERSION MEMORY SIZE IN KILOBYTES
         4                  ;
         5                  ;	"BIAS" IS ADDRESS OFFSET FROM 3400H FOR MEMORY SYSTEMS
         6                  ;	THAN 16K (REFERRED TO AS"B" THROUGHOUT THE TEXT)
         7                  ;
         8   0000 =         BIAS	EQU	(MSIZE-20)*1024
         9   3400 =         CCP	EQU	3400H+BIAS	;BASE OF CCP
        10   3C06 =         BDOS	EQU	CCP+806H	;BASE OF BDOS
        11   4A00 =         BIOS	EQU	CCP+1600H	;BASE OF BIOS
        12   0004 =         CDISK	EQU	0004H		;CURRENT DISK NUMBER 0=A,... L5=P
        13   0003 =         IOBYTE	EQU	0003H		;INTEL I/O BYTE
        14                  ;
        15   4A00           	ORG	BIOS		;ORIGIN OF THIS PROGRAM
        16   002C =         NSECTS	EQU	($-CCP)/128	;WARM START SECTOR COUNT
        17                  ;
        18                  ;	JUMP VECTOR FOR INDIVIDUAL SUBROUTINES
        19                  ;
        20   4A00 C39C4A    	JMP	BOOT	;COLD START
        21   4A03 C3A64A    WBOOTE:	JMP	WBOOT	;WARM START
        22   4A06 C3114B    	JMP	CONST	;CONSOLE STATUS
        23   4A09 C3244B    	JMP	CONIN	;CONSOLE CHARACTER IN
        24   4A0C C3374B    	JMP	CONOUT	;CONSOLE CHARACTER OUT
        25   4A0F C3494B    	JMP	LIST	;LIST CHARACTER OUT
        26   4A12 C34D4B    	JMP	PUNCH	;PUNCH CHARACTER OUT
        27   4A15 C34F4B    	JMP	READER	;READER CHARACTER OUT
        28   4A18 C3544B    	JMP	HOME	;MOVE HEAD TO HOME POSITION
        29   4A1B C35A4B    	JMP	SELDSK	;SELECT DISK
        30   4A1E C37D4B    	JMP	SETTRK	;SET TRACK NUMBER
        31   4A21 C3924B    	JMP	SETSEC	;SET SECTOR NUMBER
        32   4A24 C3AD4B    	JMP	SETDMA	;SET DMA ADDRESS
        33   4A27 C3C34B    	JMP	READ	;READ DISK
        34   4A2A C3D64B    	JMP	WRITE	;WRITE DISK
        35   4A2D C34B4B    	JMP	LISTST	;RETURN LIST STATUS
        36   4A30 C3A74B    	JMP	SECTRAN	;SECTOR TRANSLATE
        37                  ;
        38                  ;	FIXED DATA TABLES FOR FOUR-DRIVE STANDARD
        39                  ;	IBM-COMPATIBLE 8" DISKS
        40                  ;
        41                  ;	DISK PARAMETER HEADER FOR DISK 00
        42   4A33 734A0000  DPBASE:	DW	TRANS, 0000H
        43   4A37 00000000  	DW	0000H, 0000H
        44   4A3B F04C8D4A  	DW	DIRBF, DPBLK
        45   4A3F EC4D704D  	DW	CHK00, ALL00
        46                  ;	DISK PARAMETER HEADER FOR DISK 01
        47   4A43 734A0000  	DW	TRANS, 0000H
        48   4A47 00000000  	DW	0000H, 0000H
        49   4A4B F04C8D4A  	DW	DIRBF, DPBLK
        50   4A4F FC4D8F4D  	DW	CHK01, ALL01
        51                  ;	DISK PARAMETER HEADER FOR DISK 02
        52   4A53 734A0000  	DW	TRANS, 0000H
        53   4A57 00000000  	DW	0000H, 0000H
        54   4A5B F04C8D4A  	DW	DIRBF, DPBLK
        55   4A5F 0C4EAE4D  	DW	CHK02, ALL02
        56                  ;	DISK PARAMETER HEADER FOR DISK 03
        57   4A63 734A0000  	DW	TRANS, 0000H
        58   4A67 00000000  	DW	0000H, 0000H
        59   4A6B F04C8D4A  	DW	DIRBF, DPBLK
        60   4A6F 1C4ECD4D  	DW	CHK03, ALL03
        61                  ;
        62                  ;	SECTOR TRANSLATE VECTOR
        63   4A73 01070D13  TRANS:	DB	 1,  7, 13, 19	;SECTORS  1,  2,  3,  4
        64   4A77 19050B11  	DB	25,  5, 11, 17	;SECTORS  5,  6,  7,  6
        65   4A7B 1703090F  	DB	23,  3,  9, 15	;SECTORS  9, 10, 11, 12
        66   4A7F 1502080E  	DB	21,  2,  8, 14	;SECTORS 13, 14, 15, 16
        67   4A83 141A060C  	DB	20, 26,  6, 12	;SECTORS 17, 18, 19, 20
        68   4A87 1218040A  	DB	18, 24,  4, 10	;SECTORS 21, 22, 23, 24
        69   4A8B 1016      	DB	16, 22		;SECTORS 25, 26
        70                  ;
        71                  DPBLK:	;DISK PARAMETER BLOCK, COMMON TO ALL DISKS
        72   4A8D 1A00      	DW	26		;SECTORS PER TRACK
        73   4A8F 03        	DB	3		;BLOCK SHIFT FACTOR
        74   4A90 07        	DB	7		;BLOCK MASK
        75   4A91 00        	DB	0		;NULL MASK
        76   4A92 F200      	DW	242		;DISK SIZE-1
        77   4A94 3F00      	DW	63		;DIRECTORY MAX
        78   4A96 C0        	DB	192		;ALLOC 0
        79   4A97 00        	DB	0		;ALLOC 1
        80   4A98 1000      	DW	16		;CHECK SIZE
        81   4A9A 0200      	DW	2		;TRACK OFFSET
        82                  ;
        83                  ;	END OF FIXED TABLES
        84                  ;
        85                  ;	INDIVIDUAL SUBROUTINES TO PERFORM EACH FUNCTION
        86                  BOOT:	;SIMPLEST CASE IS TO JUST PERFORM PARAMETER INITIALIZATION
        87   4A9C AF        	XRA	A		;ZERO IN THE ACCUM
        88   4A9D 320300    	STA	IOBYTE		;CLEAR THE IOBYTE
        89   4AA0 320400    	STA	CDISK		;SELECT DISK ZERO
        90   4AA3 C3EF4A    	JMP	GOCPM		;INITIALIZE AND GO TO CP/M
        91                  ;
        92                  WBOOT:	;SIMPLEST CASE IS TO READ THE DISK UNTIL ALL SECTORS LOADED
        93   4AA6 318000    	LXI	SP, 80H		;USE SPACE BELOW BUFFER FOR STACK
        94   4AA9 0E00      	MVI	C, 0		;SELECT DISK 0
        95   4AAB CD5A4B    	CALL	SELDSK
        96   4AAE CD544B    	CALL	HOME		;GO TO TRACK 00
        97                  ;
        98   4AB1 062C      	MVI	B, NSECTS	;B COUNTS * OF SECTORS TO LOAD
        99   4AB3 0E00      	MVI	C, 0		;C HAS THE CURRENT TRACK NUMBER
       100   4AB5 1602      	MVI	D, 2		;D HAS THE NEXT SECTOR TO READ
       101                  ;	NOTE THAT WE BEGIN BY READING TRACK 0, SECTOR 2 SINCE SECTOR 1
       102                  ;	CONTAINS THE COLD START LOADER, WHICH IS SKIPPED IN A WARM START
       103   4AB7 210034    	LXI	H, CCP		;BASE OF CP/M (INITIAL LOAD POINT)
       104                  LOAD1:	;LOAD	ONE MORE SECTOR
       105   4ABA C5        	PUSH	B		;SAVE SECTOR COUNT, CURRENT TRACK
       106   4ABB D5        	PUSH	D		;SAVE NEXT SECTOR TO READ
       107   4ABC E5        	PUSH	H		;SAVE DMA ADDRESS
       108   4ABD 4A        	MOV	C, D		;GET SECTOR ADDRESS TO REGISTER C
       109   4ABE CD924B    	CALL	SETSEC		;SET SECTOR ADDRESS FROM REGISTER C
       110   4AC1 C1        	POP	B		;RECALL DMA ADDRESS TO B, C
       111   4AC2 C5        	PUSH	B		;REPLACE ON STACK FOR LATER RECALL
       112   4AC3 CDAD4B    	CALL	SETDMA		;SET DMA ADDRESS FROM B, C
       113                  ;
       114                  ;	DRIVE SET TO 0, TRACK SET, SECTOR SET, DMA ADDRESS SET
       115   4AC6 CDC34B    	CALL	READ
       116   4AC9 FE00      	CPI	00H		;ANY ERRORS?
       117   4ACB C2A64A    	JNZ	WBOOT		;RETRY THE ENTIRE BOOT IF AN ERROR OCCURS
       118                  ;
       119                  ;	NO ERROR, MOVE TO NEXT SECTOR
       120   4ACE E1        	POP	H		;RECALL DMA ADDRESS
       121   4ACF 118000    	LXI	D, 128		;DMA=DMA+128
       122   4AD2 19        	DAD	D		;NEW DMA ADDRESS IS IN H, L
       123   4AD3 D1        	POP	D		;RECALL SECTOR ADDRESS
       124   4AD4 C1        	POP	B	;RECALL NUMBER OF SECTORS REMAINING, AND CURRENT TRK
       125   4AD5 05        	DCR	B		;SECTORS=SECTORS-1
       126   4AD6 CAEF4A    	JZ	GOCPM		;TRANSFER TO CP/M IF ALL HAVE BEEN LOADED
       127                  ;
       128                  ;	MORE	SECTORS REMAIN TO LOAD, CHECK FOR TRACK CHANGE
       129   4AD9 14        	INR	D
       130   4ADA 7A        	MOV	A,D		;SECTOR=27?, IF SO, CHANGE TRACKS
       131   4ADB FE1B      	CPI	27
       132   4ADD DABA4A    	JC	LOAD1		;CARRY GENERATED IF SECTOR<27
       133                  ;
       134                  ;	END OF	CURRENT TRACK,	GO TO NEXT TRACK
       135   4AE0 1601      	MVI	D, 1		;BEGIN WITH FIRST SECTOR OF NEXT TRACK
       136   4AE2 0C        	INR	C		;TRACK=TRACK+1
       137                  ;
       138                  ;	SAVE	REGISTER STATE, AND CHANGE TRACKS
       139   4AE3 C5        	PUSH	B
       140   4AE4 D5        	PUSH	D
       141   4AE5 E5        	PUSH	H
       142   4AE6 CD7D4B    	CALL	SETTRK		;TRACK ADDRESS SET FROM REGISTER C
       143   4AE9 E1        	POP	H
       144   4AEA D1        	POP	D
       145   4AEB C1        	POP	B
       146   4AEC C3BA4A    	JMP	LOAD1		;FOR ANOTHER SECTOR
       147                  ;
       148                  ;	END OF	LOAD OPERATION, SET PARAMETERS AND GO TO CP/M
       149                  GOCPM:
       150   4AEF 3EC3      	MVI	A, 0C3H		;C3 IS A JMP INSTRUCTION
       151   4AF1 320000    	STA	0		;FOR JMP TO WBOOT
       152   4AF4 21034A    	LXI	H, WBOOTE	;WBOOT ENTRY POINT
       153   4AF7 220100    	SHLD	1		;SET ADDRESS FIELD FOR JMP AT 0
       154                  ;
       155   4AFA 320500    	STA	5		;FOR JMP TO BDOS
       156   4AFD 21063C    	LXI	H, BDOS		;BDOS ENTRY POINT
       157   4B00 220600    	SHLD	6		;ADDRESS FIELD OF JUMP AT 5 TO BDOS
       158                  ;
       159   4B03 018000    	LXI	B, 80H		;DEFAULT DMA ADDRESS IS 80H
       160   4B06 CDAD4B    	CALL	SETDMA
       161                  ;
       162   4B09 FB        	EI			;ENABLE THE INTERRUPT SYSTEM
       163   4B0A 3A0400    	LDA	CDISK		;GET CURRENT DISK NUMBER
       164   4B0D 4F        	MOV	C, A		;SEND TO THE CCP
       165   4B0E C30034    	JMP	CCP		;GO TO CP/M FOR FURTHER PROCESSING
       166                  ;
       167                  ;
       168                  ;	SIMPLE I/O HANDLERS (MUST BE FILLED IN BY USER)
       169                  ;	IN EACH CASE, THE ENTRY POINT IS PROVIDED, WITH SPACE RESERVED
       170                  ;	TO INSERT YOUR OWN CODE
       171                  ;
       172                  CONST:	;CONSOLE STATUS, RETURN 0FFH IF CHARACTER READY, 00H IF NOT
       173   4B11           	DS     10H		;SPACE FOR STATUS SUBROUTINE
       174   4B21 3E00      	MVI    A, 00H
       175   4B23 C9        	RET
       176                  ;
       177                  CONIN:	;CONSOLE CHARACTER INTO REGISTER A
       178   4B24           	DS	10H		;SPACE FOR INPUT ROUTINE
       179   4B34 E67F      	ANI	7FH		;STRIP PARITY BIT
       180   4B36 C9        	RET
       181                  ;
       182                  CONOUT:	;CONSOLE CHARACTER OUTPUT FROM REGISTER C
       183   4B37 79        	MOV	A, C		;GET TO ACCUMULATOR
       184   4B38           	DS	10H		;SPACE FOR OUTPUT ROUTINE
       185   4B48 C9        	RET
       186                  ;
       187                  LIST:	;LIST CHARACTER FROM REGISTER C
       188   4B49 79        	MOV	A, C	  	;CHARACTER TO REGISTER A
       189   4B4A C9        	RET		  	;NULL SUBROUTINE
       190                  ;
       191                  LISTST:	;RETURN LIST STATUS (0 IF NOT READY, 1 IF READY)
       192   4B4B AF        	XRA	A	 	;0 IS ALWAYS OK TO RETURN
       193   4B4C C9        	RET
       194                  ;
       195                  PUNCH:	;PUNCH	CHARACTER FROM	REGISTER C
       196   4B4D 79        	MOV	A, C		;CHARACTER TO REGISTER A
       197   4B4E C9        	RET			;NULL SUBROUTINE
       198                  ;
       199                  ;
       200                  READER:	;READER CHARACTER INTO REGISTER A FROM READER DEVICE
       201   4B4F 3E1A      	MVI    A, 1AH		;ENTER END OF FILE FOR NOW (REPLACE LATER)
       202   4B51 E67F      	ANI    7FH		;REMEMBER TO STRIP PARITY BIT
       203   4B53 C9        	RET
       204                  ;
       205                  ;
       206                  ;	I/O DRIVERS FOR THE DISK FOLLOW
       207                  ;	FOR NOW, WE WILL SIMPLY STORE THE PARAMETERS AWAY FOR USE
       208                  ;	IN THE READ AND WRITE	SUBROUTINES
       209                  ;
       210                  HOME:	;MOVE TO THE TRACK 00	POSITION OF CURRENT DRIVE
       211                  ;	TRANSLATE THIS CALL INTO A SETTRK CALL WITH PARAMETER 00
       212   4B54 0E00      	MVI    C, 0		;SELECT TRACK 0
       213   4B56 CD7D4B    	CALL   SETTRK
       214   4B59 C9        	RET			;WE WILL MOVE TO 00 ON FIRST READ/WRITE
       215                  ;
       216                  SELDSK:	;SELECT DISK GIVEN BY REGISTER C
       217   4B5A 210000    	LXI	H, 0000H	;ERROR RETURN CODE
       218   4B5D 79        	MOV	A, C
       219   4B5E 32EF4C    	STA	DISKNO
       220   4B61 FE04      	CPI	4		;MUST BE BETWEEN 0 AND 3
       221   4B63 D0        	RNC			;NO CARRY IF 4, 5,...
       222                  ;	DISK NUMBER IS IN THE PROPER RANGE
       223   4B64           	DS	10		;SPACE FOR DISK SELECT
       224                  ;	COMPUTE PROPER DISK PARAMETER HEADER ADDRESS
       225   4B6E 3AEF4C    	LDA	DISKNO
       226   4B71 6F        	MOV	L, A		;L=DISK NUMBER 0, 1, 2, 3
       227   4B72 2600      	MVI	H, 0		;HIGH ORDER ZERO
       228   4B74 29        	DAD	H		;*2
       229   4B75 29        	DAD	H		;*4
       230   4B76 29        	DAD	H		;*8
       231   4B77 29        	DAD	H		;*16 (SIZE OF EACH HEADER)
       232   4B78 11334A    	LXI	D, DPBASE
       233   4B7B 09        	DAD	0		;HL=,DPBASE (DISKNO*16)
       234   4B7C C9        	RET
       235                  ;
       236                  SETTRK:	;SET TRACK GIVEN BY REGISTER C
       237   4B7D 79        	MOV	A, C
       238   4B7E 32E94C    	STA	TRACK
       239   4B81           	DS	10H		;SPACE FOR TRACK SELECT
       240   4B91 C9        	RET
       241                  ;
       242                  SETSEC:	;SET SECTOR GIVEN BY REGISTER C
       243   4B92 79        	MOV	A, C
       244   4B93 32EB4C    	STA	SECTOR
       245   4B96           	DS	10H		;SPACE FOR SECTOR SELECT
       246   4BA6 C9        	RET
       247                  ;
       248                  ;
       249                  SECTRAN:
       250                  	;TRANSLATE THE SECTOR GIVEN BY BC USING THE
       251                  	;TRANSLATE TABLE GIVEN BY DE
       252   4BA7 EB        	XCHG			;HL=.TRANS
       253   4BA8 09        	DAD	B		;HL=.TRANS (SECTOR)
       254   4BA9 6E        	MOV	L, M		;L=TRANS (SECTOR)
       255   4BAA 2600      	MVI	H, 0		;HL=TRANS (SECTOR)
       256   4BAC C9        	RET			;WITH VALUE IN HL
       257                  ;
       258                  SETDMA:	;SET	DMA ADDRESS GIVEN BY REGISTERS B AND C
       259   4BAD 69        	MOV	L, C		;LOW ORDER ADDRESS
       260   4BAE 60        	MOV	H, B		;HIGH ORDER ADDRESS
       261   4BAF 22ED4C    	SHLD	DMAAD		;SAVE THE ADDRESS
       262   4BB2           	DS	10H		;SPACE FOR SETTING THE DMA ADDRESS
       263   4BC2 C9        	RET
       264                  ;
       265                  READ:	;PERFORM READ OPERATION (USUALLY THIS IS SIMILAR TO WRITE
       266                  ;	SO WE WILL ALLOW SPACE TO SET UP READ COMMAND, THEN USE
       267                  ;	COMMON CODE IN WRITE)
       268   4BC3           	DS	10H		;SET UP READ COMMAND
       269   4BD3 C3E64B    	JMP	WAITIO		;TO PERFORM THE ACTUAL I/O
       270                  ;
       271                  WRITE:	;PERFORM A WRITE OPERATION
       272   4BD6           	DS	10H		;SET UP WRITE COMMAND
       273                  ;
       274                  WAITIO:	;ENTER	HERE FROM READ	AND WRITE TO PERFORM THE ACTUAL I/O
       275                  ;	OPERATION. RETURN A 00H IN REGISTER A IF THE OPERATION COMPLETES
       276                  ;	PROPERLY, AND 0LH IF AN ERROR OCCURS DURING THE READ OR WRITE
       277                  ;
       278                  ;	IN THIS CASE, WE HAVE SAVED THE DISK NUMBER IN 'DISKNO' (0, 1)
       279                  ;			THE TRACK NUMBER IN 'TRACK' (0-76)
       280                  ;			THE SECTOR NUMBER IN 'SECTOR' (1-26)
       281                  ;			THE DMA ADDRESS IN 'DMAAD' (0-65535)
       282   4BE6           	DS	256		;SPACE RESERVED FOR I/O DRIVERS
       283   4CE6 3E01      	MVI	A, 1		;ERROR CONDITION
       284   4CE8 C9        	RET			;REPLACED WHEN FILLED-IN
       285                  ;
       286                  ;	THE REMAINDER OF THE CBIOS IS RESERVED UNINITIALIZED
       287                  ;	DATA AREA, AND DOES NOT NEED TO BE A PART OF THE
       288                  ;	SYSTEM	MEMORY IMAGE (THE SPACE MUST BE AVAILABLE,
       289                  ;	HOWEVER, BETWEEN"BEGDAT" AND"ENDDAT").
       290                  ;
       291   4CE9           TRACK:	DS	2		;TWO BYTES FOR EXPANSION
       292   4CEB           SECTOR:	DS	2		;TWO BYTES FOR EXPANSION
       293   4CED           DMAAD:	DS	2		;DIRECT MEMORY ADDRESS
       294   4CEF           DISKNO:	DS	1		;DISK NUMBER 0-15
       295                  ;
       296                  ;	SCRATCH RAM AREA FOR BDOS USE
       297   4CF0 =         BEGDAT	EQU	$	 	;BEGINNING OF DATA AREA
       298   4CF0           DIRBF:	DS	128	 	;SCRATCH DIRECTORY AREA
       299   4D70           ALL00:	DS	31	 	;ALLOCATION VECTOR 0
       300   4D8F           ALL01:	DS	31	 	;ALLOCATION VECTOR 1
       301   4DAE           ALL02:	DS	31	 	;ALLOCATION VECTOR 2
       302   4DCD           ALL03:	DS	31	 	;ALLOCATION VECTOR 3
       303   4DEC           CHK00:	DS	16		;CHECK VECTOR 0
       304   4DFC           CHK01:	DS	16		;CHECK VECTOR 1
       305   4E0C           CHK02:	DS	16	 	;CHECK VECTOR 2
       306   4E1C           CHK03:	DS	16	 	;CHECK VECTOR 3
       307                  ;
       308   4E2C =         ENDDAT	EQU	$	 	;END OF DATA AREA
       309   013C =         DATSIZ	EQU	$-BEGDAT;	;SIZE OF DATA AREA
       310   4E2C           	END
    ALL00            4D70    45   299#
    ALL01            4D8F    50   300#
    ALL02            4DAE    55   301#
    ALL03            4DCD    60   302#
    BDOS             3C06    10#  156
    BEGDAT           4CF0   297#  309
    BIAS             0000     8#    9
    BIOS             4A00    11#   15
    BOOT             4A9C    20    86#
    CCP              3400     9#   10    11    16   103   165
    CDISK            0004    12#   89   163
    CHK00            4DEC    45   303#
    CHK01            4DFC    50   304#
    CHK02            4E0C    55   305#
    CHK03            4E1C    60   306#
    CONIN            4B24    23   177#
    CONOUT           4B37    24   182#
    CONST            4B11    22   172#
    DATSIZ           013C   309#
    DIRBF            4CF0    44    49    54    59   298#
    DISKNO           4CEF   219   225   294#
    DMAAD            4CED   261   293#
    DPBASE           4A33    42#  232
    DPBLK            4A8D    44    49    54    59    71#
    ENDDAT           4E2C   308#
    GOCPM            4AEF    90   126   149#
    HOME             4B54    28    96   210#
    IOBYTE           0003    13#   88
    LIST             4B49    25   187#
    LISTST           4B4B    35   191#
    LOAD1            4ABA   104#  132   146
    MSIZE            0014     3#    8
    NSECTS           002C    16#   98
    PUNCH            4B4D    26   195#
    READ             4BC3    33   115   265#
    READER           4B4F    27   200#
    SECTOR           4CEB   244   292#
    SECTRAN          4BA7    36   249#
    SELDSK           4B5A    29    95   216#
    SETDMA           4BAD    32   112   160   258#
    SETSEC           4B92    31   109   242#
    SETTRK           4B7D    30   142   213   236#
    TRACK            4CE9   238   291#
    TRANS            4A73    42    47    52    57    63#
    WAITIO           4BE6   269   274#
    WBOOT            4AA6    21    92#  117
    WBOOTE           4A03    21#  152
    WRITE            4BD6    34   271#

Back to title page Next